package miage.gestioncabinet.coredb;

import java.util.Calendar;
import java.util.List;

import javax.persistence.*;

import miage.gestioncabinet.api.Consultation;
import miage.gestioncabinet.api.Interaction;
import miage.gestioncabinet.api.Medecin;
import miage.gestioncabinet.api.Patient;
import miage.gestioncabinet.api.Produit;
import miage.gestioncabinet.api.Traitement;

@Entity
@Table(name="consultation")
@NamedQueries({
	@NamedQuery(name="getConsultation", query="SELECT c FROM ConsultationDB c WHERE c.dateRdv <= :today AND c.heureDebut <= :todayHeure AND c.heureFin >= :todayHeure"),
	@NamedQuery(name="getDateDebut", query="SELECT c.dateRdv, c.heureDebut FROM ConsultationDB c WHERE c.medecin = :medecin ORDER BY c.dateRdv, c.heureDebut"),
	@NamedQuery(name="getDateFin", query="SELECT c.dateRdv, c.heureFin FROM ConsultationDB c WHERE c.medecin = :medecin ORDER BY c.dateRdv, c.heureFin  DESC"),
	@NamedQuery(name="listerRdv", query="SELECT c FROM ConsultationDB c WHERE c.medecin = :medecin AND c.heureDebut BETWEEN :heureDeb AND :heureFin AND c.heureFin BETWEEN :heureDeb AND :heureFin"),
	@NamedQuery(name="getRdvCourant", query="SELECT c FROM ConsultationDB c WHERE c.heureDebut BETWEEN :heureDeb AND :heureFin AND c.heureFin BETWEEN :heureDeb AND :heureFin")
})
public class ConsultationDB implements Consultation{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -2764437921796148444L;
	@Id
	@GeneratedValue
	@Column
	private int id;
	@Column
	private Calendar dateRdv;
	@Column
	private Calendar heureDebut;
	@Column
	private Calendar heureFin;
	@Column
	private String compteRendu;
	@ManyToOne
	@JoinColumn(name="patient")
	private PatientDB patient;
	@ManyToOne
	@JoinColumn(name="medecin")
	private MedecinDB medecin;
	
	@OneToMany
	private List<TraitementDB> prescription;
	@OneToMany
	private List<InteractionDB> interactions;

	/**
	 * Comparaison de deux consultations
	 * @param Constultation o : Consultation à comparer avec la consultation courante
	 */
	public int compareTo(ConsultationDB o) {
		return (this.patient == o.getPatient() &&
				this.medecin == o.getMedecin() &&
				this.heureDebut == o.getDebut() &&
				this.heureFin == o.getFin() &&
				this.compteRendu == o.getCompteRendu() && 
				this.prescription == o.getPrescriptions() &&
				this.interactions == o.getInteraction())
				? 1 : 0 ;
	}
	
	public boolean equals(Consultation o) {
		return (this.patient.getNom() == o.getPatient().getNom() &&
				this.patient.getPrenom() == o.getPatient().getPrenom());
	}

	@Override
	/**
	 * Affichage du Patient qui consulte
	 */
	public Patient getPatient() {
		return this.patient;
	}

	@Override
	/**
	 * Modification du Patient qui consulte
	 * @param Patient patient : valeurs du patient à modifier
	 */
	public void setPatient(Patient patient) {
		PatientDB p = new PatientDB();
		p.setDateNaissance(patient.getDateNaissance());
		p.setNom(patient.getNom());
		p.setPrenom(patient.getPrenom());
		p.setSexe(patient.getSexe());
		this.patient = p;
	}

	@Override
	/**
	 * Affichage du médecin qui donne la consultation
	 */
	public Medecin getMedecin() {
		return this.medecin;
	}

	@Override
	/**
	 * Modification du médecin qui donne la consultation
	 * @param Medecin medecin : valeurs du médecin qui donne la modification
	 */
	public void setMedecin(Medecin medecin) {
		MedecinDB m = new MedecinDB();
		m.setNom(medecin.getNom());
		m.setPrenom(medecin.getPrenom());;
		this.medecin = m;
	}

	@Override
	/**
	 * Affichage de la date de début de la consutlation
	 */
	public Calendar getDebut() {
		return this.heureDebut;
	}

	@Override
	/**
	 * Modification de la date de début de la consultation
	 * @param Calendar date : date de début de la consultation
	 */
	public void setDebut(Calendar date) {
		this.heureDebut = date;
	}

	@Override
	/**
	 * Affichage de la date de fin de la consutlation
	 */
	public Calendar getFin() {
		return this.heureFin;
	}

	@Override
	/**
	 * Modification de la date de fin de la consultation
	 * @param Calendar date : date de fin de la consultation
	 */
	public void setFin(Calendar date) {
		this.heureFin = date;
	}

	@Override
	/**
	 * Affichage du compte rendu de la consultation
	 */
	public String getCompteRendu() {
		return this.compteRendu;
	}

	@Override
	/**
	 * Modification du compte rendu de la consultation
	 */
	public void setCompteRendu(String texte) {
		this.compteRendu = texte;
	}

	/**
	 * Affichage de la prescription de la consultation
	 */
	public List<TraitementDB> getPrescriptions() {
		return this.prescription;
	}

	@Override
	/**
	 * Ajout d'un médicament au traitement de la consultation
	 * @param Produit produit : médicament à ajouter
	 */
	public Boolean ajouterTraitement(Produit produit) {
		TraitementDB t = new TraitementDB();
		t.setProduit(produit);
		return this.prescription.add(t);
	}

	@Override
	/**
	 * Suppression du traitement
	 * @param Traitement medicament : médicament à supprimer
	 */
	public Boolean supprimerTraitement(Traitement medicament) {
		return this.prescription.remove(medicament);
	}

	/**
	 * Affichage des intéractions de la consultation
	 */
	public List<InteractionDB> getInteraction() {
		return this.interactions;
	}

	/**
	 * Modification des intéractions de la consultation
	 * @param List<Interaction> interactions : intéractions de la consultation
	 */
	public void setInteraction(List<InteractionDB> interactions) {
		this.interactions = interactions;
	}

	public String toString() {
		return this.patient.getPrenom() + " " + this.patient.getNom();
	}

	@Override
	public int compareTo(Consultation arg0) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public List<Traitement> getPrescription() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<Interaction> getInteractions() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void setInteractions(List<Interaction> interactions) {
		// TODO Auto-generated method stub
		
	}

	public Calendar getDateRdv() {
		return dateRdv;
	}

	public void setDateRdv(Calendar dateRdv) {
		this.dateRdv = dateRdv;
	}

	public Calendar getHeureDebut() {
		return heureDebut;
	}

	public void setHeureDebut(Calendar heureDebut) {
		this.heureDebut = heureDebut;
	}

	public Calendar getHeureFin() {
		return heureFin;
	}

	public void setHeureFin(Calendar heureFin) {
		this.heureFin = heureFin;
	}

}
